module.exports = () => {
    return async (ctx, next) => {
        // 如果在白名单里面，直接不校验了
        if (!["/login", "/register"].includes(ctx.path)) {
            // 校验是否存在 token
            const token = ctx.headers.token;

            // 没有 token 时
            if (!token) {
                ctx.body = {
                    code: 401,
                    message: "token 不存在，无法访问",
                };
                return;
            }

            // 校验并解析 token
            try {
                // 校验并解析 token 中的内容
                const user = ctx.helper.checkToken(token);
                // 挂在到 ctx 上
                ctx.user = user;
            } catch (error) {
                if (error.name === "TokenExpiredError") {
                    ctx.body = {
                        code: 401,
                        message: "token已过期",
                    };
                    return;
                }

                if (error.name === "JsonWebTokenError") {
                    ctx.body = {
                        code: 401,
                        message: "token非法",
                    };
                    return;
                }
            }
        }

        // 向下走
        await next();
    };
};
